#pragma once
#include "AtomicType.h"


// AbstractType command target

class AbstractType : public Type
{
	
protected:
	TokenPair VarBody;

public:
	Type::const_reference getBody() const;
	Type::const_reference getVar() const;

public:
	//Type overides
	bool isAbstractType() const{return true;};
	
	
public:
	//Token overides
	Token::pointer applyArgument(Token::const_reference)  const;
	Token::pointer clone() const;
	
public:
	string toString() const;
	string view() const;

public:
	bool operator==(Token::const_reference To) const;
	Token::pointer replaceAll(Token::const_reference, Token::const_reference) const;
	size_t complexity( ) const;

public:
	AbstractType(const Type&, const  Type&, const string& = "");
	AbstractType(const AbstractType&);
	virtual ~AbstractType();
	
public:
	bool hasSubType(Type::const_reference Ty) const {return getBody().hasSubType(Ty);};
	friend class AbstractTypeTerm;
};



